package com.me.myFramework.myAop.aop100;

import com.me.myFramework.myAop.IBuy;
import com.me.myFramework.myAop.Switch;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * 自己实现 AOP-1：
 *  最基础的硬编码的AOP
 *
 * @author ME
 */
public class MyProxy100 {

    public static void main(String[] args) {
        IBuy target = new Switch();
        IBuy proxy = (IBuy) Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                // TODO 基于 jdk动态代理简单的插入一段增强逻辑
                String methodName = method.getName();// 仅仅是不想对 Object方法执行切面逻辑
                if (!isCustomMethod(methodName)) {
                    System.out.println("[AOP] 就是想记录谁消费了：" + args[0]);
                }

                return method.invoke(target, args);
            }
        });

        System.out.println("\n----------------------- toString() ---------------------------------");
        System.out.println(proxy.toString());
        System.out.println();

        proxy.buy("ljy");
    }

    static boolean isCustomMethod(String methodName) {
        return !"toString".equals(methodName) && !"hashCode".equals(methodName) && !"equals".equals(methodName)
                && !"clone".equals(methodName);
    }

}
